package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblDomestic;
import com.mastercard.assets.jpa.TblFlujoAutorizacion;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.GenerarCampanaRegistrarForm;
import com.mastercard.assets.web.util.to.BasicToolTO;
import com.mastercard.assets.web.util.to.CampaniaProductoAdq;
import com.mastercard.assets.web.util.to.CampaniaProductoAdqWraper;
import com.mastercard.assets.web.util.to.CampaniaProductoWraper;
import com.mastercard.assets.web.util.to.UserLogin;

public class GenerarCampanaRegistrar
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		// formulario
		GenerarCampanaRegistrarForm f = ( GenerarCampanaRegistrarForm ) form ;
		
		// toma la operacion
		int operation = f.getOperation( ) ;	
		
		// en caso de cancelacion
		if( operation == 2 )
		{
			user.setNextWorkArea( "/WEB-INF/pages/WorkArea/GenerarCampanaCancelado.jsp" ) ;
			
			return mapping.findForward( "success" ) ;
		}
		// en caso d que venga de la modificacion del combo de tipo de producto
		if( operation == 3 )
		{
//			f.setProducto( new int[ 0 ] ) ;
//			
//			int[] packageCountId = f.getPackageCountId( ) ;
//
//			List< TblCuentaPaquete > paquetesParaCampana = new ArrayList< TblCuentaPaquete >( ) ;
//			
//			// recorre
//			for( int p : packageCountId )
//			{
//				// agrega
//				paquetesParaCampana.add( MasterCardDAO.findTblCuentaPaqueteById( p ) ) ;
//			}
//			
//			f.setPaquetesParaCampana( paquetesParaCampana ) ;
			user.setManejadorCampana( f ) ;
			request.setAttribute( "GenerarCampanaRegistrarForm" , f ) ;
			
			System.out.println( request.getQueryString( ) ) ;
			
			Enumeration< String > names = request.getParameterNames( ) ;
			
			while( names.hasMoreElements( ) )
			{
				String name = names.nextElement( ) ;
				System.out.println( name + ": " + request.getParameter( name ) ) ;
			}
			
			f.setOperation( 0 ) ;
			
			String url = "/GenerarCampanaIn.do" ;
			
			int[ ] tipoProductos = f.getTipoProducto( ) ;
			
			// recorre
			if( tipoProductos != null && tipoProductos.length > 0 )
			{
				for( int i = 0 ; i < tipoProductos.length ; i++ )
				{
					if( i == 0 )
						url += "?" ;
					
					url += "tipoProducto=" + tipoProductos[ i ] ;
					
					if( i < tipoProductos.length - 1 )
						url += "&" ;
				}
			}
                        f.setMultiplePartner(false);
                        f.setAutCountryM(false);
			System.out.println( "Hacia Paso 1:::: "+f.getOperation() ) ;
			System.out.println( url ) ;
			user.setNextWorkArea( url ) ;
			
			return mapping.findForward( "success" ) ;
		}
                if ( operation == 4)
                {
                 // ini hacia paso2
                    f.setOperation( 0 ) ;
                    request.setAttribute( "GenerarCampanaRegistrarForm" , f ) ;
                    GenerarCampanaRegistrarForm f2 = ( GenerarCampanaRegistrarForm ) user.getManejadorCampana( ) ;
                    request.setAttribute( "GenerarCampanaRegistrarForm2" , f2 ) ;
                    
                    f.setPaquetesParaCampana( f2.getPaquetesParaCampana( ) ) ;
                    
			System.out.println( "!!!!!!!!!!!!!!!!!!!!!!2 " + f2 ) ;
                        System.out.println( "!!!!!!!!!!!!!!!!!!!!!!2 " + f2.getPaquetesParaCampana( ) ) ;
                        System.out.println( "!!!!!!!!!!!!!!!!!!!!!!2 " + f2.getPaquetesParaCampana( ).size() ) ;
                        
                        System.out.println( "!!!!!!!!!!!!!1 " + f ) ;
                        System.out.println( "!!!!!!!!!!!!!1 " + f.getPaquetesParaCampana( ) ) ;
                        System.out.println( "!!!!!!!!!!!!!1 " + f.getPaquetesParaCampana( ).size() ) ;
                        
                        int[ ] Productos =  f.getProducto( ) ;
                        TblTipoCuenta tc = user.getActualCountType( ) ;
                        int cveCuenta = user.getActualCountId( ) ;
                        List< TblDomestic > tdom = new ArrayList< TblDomestic > () ;
                        
                        for ( int i = 0 ; i < Productos.length ; i++ )
                        {
                           for( TblCuenta cta : tc.getTblCuentas( ) )
                           {                               
                               List< TblDomestic > dom = MasterCardDAO.existActiveBpsByCountAndProductB( cta.getCveCuenta( ) , Productos[ i ] ) ;
                            
                                for ( TblDomestic d : dom )
                                {
                                    tdom.add( d ) ;
                                }                               
                           }                            
                                
                        }
                        
                        f.setTblDomestic( tdom ) ;
                        
                        String FeIni = f.getFechaIni(), FeFin = f.getFechaFin();                        
                        
                        String mes, mes1, dia, dia1, anio, anio1 ;
                        int Mes, Mes1, Dia, Dia1, Anio, Anio1, DC = 0 ;
                        
                        mes = FeIni.substring(3,5) ;
                        dia = FeIni.substring(0,2) ;
                        anio = FeIni.substring(6,10) ;
                        
                        Mes = Integer.parseInt(mes);
                        Dia = Integer.parseInt(dia);
                        Anio = Integer.parseInt(anio);
                        
                        mes1 = FeFin.substring(3,5) ;
                        dia1 = FeFin.substring(0,2) ;
                        anio1 = FeFin.substring(6,10) ;
                        
                        Mes1 = Integer.parseInt(mes1);
                        Dia1 = Integer.parseInt(dia1);
                        Anio1 = Integer.parseInt(anio1);
                        
                        if ( Anio1 == Anio  ){
                            DC = (Mes1 - Mes) + 1;
                        }
                        if ( Anio1 > Anio ){
                            DC = Mes1 - Mes ;
                            DC = DC + 13  ;
                        }
                        
                        if ( DC == 0 )
                            DC = 1 ;
                       
                        String[] Ldc = new String[DC];                        
                        
                        f.setDuraCamp(Ldc);       
                        f.setDuCa(DC);
                        
                        List< TblCuentaPaquete > tCP =  f.getPaquetesParaCampana( ) ;
                        float costoPaquete = 0 , costoGlob = 0 ;
                        
                        for( TblCuentaPaquete tcp : tCP )
                        {
                            // toma el asset
                            TblAsset ass = tcp.getTblPaquete( ).getTblAsset( ) ;
                            
                            // parametros habitacion y fondeado del paquete
                            int paqHab = tcp.getTblPaquete( ).getHabitacion( ) ;
                            int paqFond = tcp.getTblPaquete( ).getFondeado( ) ;
                            
                            if ( paqHab == 1 && paqFond == 1 )
                            {
                                costoPaquete = ass.getCostoSenLoc();
                            }else
                            if ( paqHab == 2 && paqFond == 1 )
                            {
                                costoPaquete = ass.getCostoDobLoc();
                            }else
                            if ( paqHab == 2 && paqFond == 2 )
                            {
                                costoPaquete = ass.getCostoDobReg();
                            }else
                            if ( paqHab == 1 && paqFond == 2 )
                            {
                                costoPaquete = ass.getCostoSenReg();
                            }
                            
                            System.out.println(":::Individual::: " +costoPaquete);
                            costoGlob += costoPaquete ;
                            
                            System.out.println(":::Global::: " +costoGlob);
                                
                        }
                        // asigna el costo total de los paquetes al form
                        f.setCtp( costoGlob ) ;
                
                        f2.setCveCuenta( user.getActualCountId( ) ) ;
			f.setEstrategica(false);                    	

			System.out.println( "Hacia Paso 2:::: "+f.getOperation() ) ;
                        
                        List< BasicToolTO > lBT = new ArrayList< BasicToolTO >( ) ;
                        int cardsCampania = 0 ;
                        for( CampaniaProductoAdqWraper Lcpaw : f.getCpaw( ) )
                        {
                            int[ ] l = new int[ f.getDuCa( ) ] ;
                            int cards = 0 ;
                            BasicToolTO bt = new BasicToolTO( ) ;
                            bt.setProd( Lcpaw.getCveProducto( ) ) ;
                            System.out.println("Prod:::: " + bt.getProd( ) ) ;                            
                            for( int i = 0 ; i < f.getDuCa( ) ; i++ )
                            {                                
                                l[ i ] = Lcpaw.getMes( i + 1 ) ;
                                cards += Lcpaw.getMes( i + 1 ) ;                                
                            }
                            bt.setListaNumero( l ) ;
                            bt.setTotalCards( cards ) ;
                            lBT.add( bt ) ;
                            cardsCampania += cards ;
                        }
                        f.setlBT( lBT ) ;
                        f.setCardsCampain( cardsCampania ) ;
                        
                        if( user.getIdioma( ) == 0 ) {
                            user.setNextWorkArea( "/WEB-INF/pages/WorkArea/GenerarCampanaDesplegarFormularioPaso2.jsp" ) ;
                        } else {
                            user.setNextWorkArea( "/WEB-INF/pages/WorkAreaEng/GenerarCampanaDesplegarFormularioPaso2.jsp" ) ;
                        }
                        
                        
                        MasterCardDAO.closeEntityManager( ) ;
			return mapping.findForward( "success" ) ;
                // fin hacia paso2
                }
                if ( operation == 5 )
                {
                    f.setOperation( 0 ) ;
                    request.setAttribute( "GenerarCampanaRegistrarForm" , f ) ;
                    GenerarCampanaRegistrarForm f2 = ( GenerarCampanaRegistrarForm ) user.getManejadorCampana( ) ;
                    request.setAttribute( "GenerarCampanaRegistrarForm2" , f2 ) ;
                    
                    f.setPaquetesParaCampana( f2.getPaquetesParaCampana( ) ) ;
                    
                        System.out.println( "!!!!!!!!!!!!!!!!!!!!!!2 " + f2 ) ;
                        System.out.println( "!!!!!!!!!!!!!!!!!!!!!!2 " + f2.getPaquetesParaCampana( ) ) ;
                        System.out.println( "!!!!!!!!!!!!!!!!!!!!!!2 " + f2.getPaquetesParaCampana( ).size() ) ;
                        
                        System.out.println( "!!!!!!!!!!!!!1 " + f ) ;
                        System.out.println( "!!!!!!!!!!!!!1 " + f.getPaquetesParaCampana( ) ) ;
                        System.out.println( "!!!!!!!!!!!!!1 " + f.getPaquetesParaCampana( ).size() ) ;
                        
                        System.out.println("Comentarios:::" + f.getComentarios( ) );
                        System.out.println("Estrategica:::" + f.getEstrategica( ) );
                        System.out.println("Roi:::::::::::" + f.getRoi( ) ) ;
                        System.out.println("::::::::::::::"   ) ;
                        
                        
                        List< CampaniaProductoWraper > CPW = f.getCpw( ) ; 
                        List< CampaniaProductoAdqWraper > CPAW = f.getCpaw( ) ;
                        
                        List<CampaniaProductoAdq> res = new ArrayList<CampaniaProductoAdq>( ) ;
                        int totalTN = 0 ;
                        for ( CampaniaProductoAdqWraper tCpaw : CPAW )
                        {
                            System.out.println("numberOfMonth::: " + tCpaw.getNumberOfMonth() );
                           
                            System.out.println("CveProd::: " + tCpaw.getCveProducto() );
                            
                            System.out.println("total::: " + tCpaw.getTotal() );
                            int[] mes = new int[20] ;
                            for ( int z = 0 ; z < tCpaw.getNumberOfMonth() ; z++ )
                            {
                                System.out.println("Month " +z+1+ " ::: " + tCpaw.getMes(z+1) );                                
                                mes[z] = tCpaw.getMes(z+1) ;
                            }
                            totalTN += tCpaw.getTotal() ;
                            System.out.println("::::::::::::::"   ) ;
                            
                            CampaniaProductoAdq cpa = new CampaniaProductoAdq (
                                    tCpaw.getNumberOfMonth() ,
                                    tCpaw.getCveProducto() ,                                
                                    mes ,                             
                                    tCpaw.getTotal() ,
                                    totalTN                                    
                                    ) ;
                            
                            res.add(cpa);
                            
                        }                        
                        
                        f.setCampaniaProductoAdq( res ) ;
                        f.setTotalTN( totalTN ) ;
                        
                        for ( CampaniaProductoWraper  tCpw : CPW )
                        {
                            System.out.println("CuentasParticipantes:::: "+tCpw.getCp());
                            System.out.println("AverageTicket:::: "+tCpw.getAt());
                            for ( int x = 0 ; x < tCpw.getRrF().length ; x++ )
                            {
                                System.out.println("ResponserateMes "+x+" :::: "+tCpw.getRrF()[x] );
                            }
                            System.out.println("Incrementaltransaction::::"+tCpw.getIt());
                            for ( int y = 0 ; y < tCpw.getGdvpmF().length ; y++ )
                            {
                                System.out.println("GDVPMes "+y+" :::: "+tCpw.getGdvpmF()[y] );
                            }
                            for ( int z = 0 ; z < f.getProducto().length ; z++ )
                            {
                                System.out.println("GDVTPprod "+z+" :::: "+tCpw.getGdvtpF() );
                            }
                            System.out.println("GdvTotal::::"+request.getParameter( "GDVTotal-h" ));
                            System.out.println("::::::::::::::"   ) ;
                        }
                        
                        String gdvT =  request.getParameter( "GDVTotal-h" ) ;
                        gdvT = gdvT.replace(" ", "") ;
                        gdvT = gdvT.replace(",", "") ;
                        f.setGdv( java.math.BigDecimal.valueOf( Double.parseDouble( gdvT ) ) ) ;
                        //f.setGdv(Long.parseLong(gdvT));
                        
                        System.out.println( "Revenue :::: "+f.getRevT() ) ;
                
                        f2.setCveCuenta( user.getActualCountId( ) ) ;
				

			System.out.println( "Hacia Paso 3:::: "+f.getOperation() ) ;
                        
                        if( user.getIdioma( ) == 0 ) {
                            user.setNextWorkArea( "/WEB-INF/pages/WorkArea/GenerarCampanaDesplegarFormularioPaso3.jsp" ) ;
                        } else {
                            user.setNextWorkArea( "/WEB-INF/pages/WorkAreaEng/GenerarCampanaDesplegarFormularioPaso3.jsp" ) ;
                        }
                        
                        MasterCardDAO.closeEntityManager( ) ;
			return mapping.findForward( "success" ) ;
                }
		
                // obtiene duracion de la campaña
                String FeIni = f.getFechaIni(), FeFin = f.getFechaFin();                        
                        
                        String mes, mes1, dia, dia1, anio, anio1 ;
                        int Mes, Mes1, Dia, Dia1, Anio, Anio1, DC = 0 ;
                        
                        mes = FeIni.substring(3,5) ;
                        dia = FeIni.substring(0,2) ;
                        anio = FeIni.substring(6,10) ;
                        
                        Mes = Integer.parseInt(mes);
                        Dia = Integer.parseInt(dia);
                        Anio = Integer.parseInt(anio);
                        
                        mes1 = FeFin.substring(3,5) ;
                        dia1 = FeFin.substring(0,2) ;
                        anio1 = FeFin.substring(6,10) ;
                        
                        Mes1 = Integer.parseInt(mes1);
                        Dia1 = Integer.parseInt(dia1);
                        Anio1 = Integer.parseInt(anio1);
                        
                        if ( Anio1 == Anio  ){
                            DC = (Mes1 - Mes) + 1 ;
                        }
                        if ( Anio1 > Anio ){
                            DC = Mes1 - Mes ;
                            DC = DC + 13 ;
                        }
                        
                        if ( DC == 0 )
                            DC = 1 ;
                       
                        String[] Ldc = new String[DC];                        
                        
                        f.setDuraCamp(Ldc);       
                        f.setDuCa(DC);
                
		// en caso de dar de alta la campania
		
		// toma los datos para dar de alta la campana
		String nombre = f.getNombre( ) ;
		Timestamp fechaIni = f.getFechaIniT( ) ;
		Timestamp fechaFin = f.getFechaFinT( ) ;
		int tipoCampania = f.getTipoCampania( ) ;
		int[ ] producto = f.getProducto( ) ;
		int[ ] tipoProducto = f.getTipoProducto( ) ;
		boolean multiplePartner = f.getMultiplePartner( ) ;
                boolean autCountryM = f.getAutCountryM( ) ;
		TblUsuario newUser = f.getNewUser( ) ;
		int cveCuenta = f.getCveCuenta( ) ;
		String texto = f.getTexto( ) ;
		int[ ] cuentaPaquetesCves = f.getPackageCountId( ) ;
                boolean estrategica = f.getEstrategica( ) ;
                String comentarios = f.getComentarios( ) ;
                java.math.BigDecimal roi = f.getRoi( ) ;
                int dMeses = f.getDuCa( ) ;
                java.math.BigDecimal revT = f.getRevT( ) ;
                String inversion = f.getInversion( ) , proposito = f.getProposito( ) ;
                java.math.BigDecimal GDV = f.getGdv( ) ;
		
		System.out.println( "*********** GDVTotal= " + request.getParameter( "GDVTotal-h" ) ) ;
                
                List< TblCuentaPaquete > tCP =  f.getPaquetesParaCampana( ) ;                
                TblFlujoAutorizacion fluAut = new TblFlujoAutorizacion( ) ;
                
                for( TblCuentaPaquete tcp : tCP ){
                    // toma el asset
                    TblAsset ass = tcp.getTblPaquete( ).getTblAsset( ) ;
                    
                    if ( fluAut.getCveFlujoAut() < 1 ){
                        
                        fluAut = ass.getTblFlujoAutorizacion( ) ;
                        
                    } else if ( ass.getTblFlujoAutorizacion( ).getPrioridad( ) < fluAut.getPrioridad( ) ) {
                        
                        fluAut = ass.getTblFlujoAutorizacion( ) ;
                    }
                        
                     
                        
                    
                    
                    
                }
		
		try
		{
			int cveCampania = MasterCardDAO.addNewCampaign( 
								user , 
								nombre , 
								fechaIni , 
								fechaFin , 
								tipoCampania , 
								producto , 
								tipoProducto , 
								multiplePartner , 
                                                                autCountryM ,
								newUser , 
								texto , 
								user.getTblUsuario( ) , 
								cuentaPaquetesCves ,
								user.getActualCountId( ) , 
								f.getCpw( ) , GDV , f.getDcInt( ) , f.getCpaw( ) ,
                                                                estrategica , 
                                                                comentarios ,
                                                                roi ,
                                                                dMeses ,
                                                                revT, 
                                                                inversion ,
                                                                proposito ,
                                                                fluAut ) ;
			
			
		}catch( MasterCardException e )
		{
			e.printStackTrace( ) ;
			
			// reproduce un error
			user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.ErrorAddingCampaign" , e.getSingularMessage( ) ) ) ;
			
                        MasterCardDAO.closeEntityManager( ) ;
			return mapping.findForward( "success" ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			// reproduce un error
			user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.modules.generarcampana.errors.ErrorAddingCampaign" , e.getMessage( ) ) ) ;
			
                        MasterCardDAO.closeEntityManager( ) ;
			return mapping.findForward( "success" ) ;
		}
		
		// en caso de que lo haga todo correctamente manda a la pagina de success
		user.setNextWorkArea( "/WEB-INF/pages/WorkArea/GenerarCampanaExito.jsp" ) ;
		
		request.getSession( ).setAttribute( "CampanaName" , nombre ) ;
		request.getSession( ).removeAttribute( "GenerarCampanaRegistrarForm" ) ;
		
                MasterCardDAO.closeEntityManager( ) ;
		return mapping.findForward( "success" ) ;
	}
	
}
